package hashfunctions;

import java.util.BitSet;

/**
 * Clase utilitaria para la conversión de Hashes
 * 
 * @author Bob Nervio
 *
 */

public class Hash {
	static public BitSet stringToBitSet(String entrada) {
		
		
		char[] chars=entrada.toCharArray();
	
		int largo=chars.length;
		BitSet salida=new BitSet(largo*8);
		char caracter=0;
		
		
		for(int i=0;i<largo;i++){
			caracter=chars[i];
			for(int j=i*8+7,k=128;k>0;j--,k/=2){
				if(caracter-k>=0){
					caracter-=k;
					salida.set(j);
				}
					
			}
			
		}
		return salida;
		
	}
	
	static public String bitSetToString(BitSet entrada) {
		String salida="";
		int largo;
		char caracter=0;
		
		largo=entrada.size()/8; //siempre se supone que nbits va a ser multiplo de 8
		
		for(int i=0;i<largo;i++){
			caracter=0;
			for(int j=i*8,k=1;k<256;j++,k*=2){
				if(entrada.get(j)){
					caracter+=k;
						
				}
			}
			if(caracter==0)caracter=128;//Con cero hay problema porq no graba el char null, se pierde un caracter y corre todos los binarios
			salida+=caracter;
		}
		
		
		
		return salida;
		
	}
	
	static public BitSet hexStringToBitSet(String entrada) {
		int largo=entrada.length();
		BitSet salida=new BitSet(largo*4);
		int caracter=0;
		
		
		for(int i=0;i<largo;i++){
			caracter=Integer.parseInt(entrada.substring(i,i+1),16);
			for(int j=i*4+3,k=8;k>0;j--,k/=2){
				if(caracter-k>=0){
					caracter-=k;
					salida.set(j);
				}
					
			}
			
		}
		return salida;
		
	}
	
	static public String bitSetToHexString(BitSet entrada) {
		//StringBuffer salida=new StringBuffer();
		String salida="";
		int largo;
		char caracter=0;
		
		largo=entrada.size()/4; //siempre se supone que nbits va a ser multiplo de 8
		
		for(int i=0;i<largo;i++){
			caracter=0;
			for(int j=i*4,k=1;k<16;j++,k*=2){
				//System.out.println("valor en " + j + " = " + entrada.get(j));
				if(entrada.get(j)){
					caracter+=k;
						//System.out.println("hay verdadero");
				}
			}
			salida+=Integer.toHexString(caracter);
		}
		return salida;
		
	}

}
